package zx.lrn.notes.basic_grammer;

/**
 * 带标签的语句控制 标签的语义有点类似于goto somewhere，在一个块状语句起始处设立一个锚点，
 * 当break到该锚点时，会跳转到锚点起始大括号对应的结束括号处
 *
 */
public class ControlWithTag {
    public static void main(String[] args) {
        useBreakFlagAtLoop();
        useContinueFlagAtLoop();
        useBreakFlagAtAnyBlock();
    }

    /**
     * 循环语句可以使用标签，内层循环可接跳出所有循环
     */
    private static void useBreakFlagAtLoop() {
        flagA:
        while (true) {
            System.out.println("while loop start");
            for (int i = 1; i <= 3; i++) {
                System.out.println(i);
                if (i == 2) {
                    break flagA; // 此处将跳到while循环的结束处
                }
            }
        }
        // "break flagA" will jump here;
        System.out.println("while loop over");
    }

    /**
     * continue语句同样可以使用标签。可以跳转到标签所指循环的起始处
     */
    private static void useContinueFlagAtLoop() {
        while (true) {
            System.out.println("level1");
            flagC:
            while (true) {
                System.out.println("level2");
                while (true) {
                    System.out.println("level3");
                    continue flagC;
                }
            }
        }
    }

    /**
     * 标签不止可以用在循环语句，可以用在任意的块状语句上
     */
    private static void useBreakFlagAtAnyBlock() {
        flagB:
        {
            System.out.println("block start");
            if (true) {
                break flagB;
            }
            System.out.println("if over");
        }
        // "break flagB" will jump here;
        System.out.println("block over");
    }
}
